<?php

require 'Zend/Loader/Autoloader.php';

class Core {

    /**
     * Запуск приложения
     */
    public static function run() {

        try {
            //Автозагрузчик
            require_once 'HTMLPurifier/Bootstrap.php';
            HTMLPurifier_Bootstrap::registerAutoload();
            $loader = Zend_Loader_Autoloader::getInstance();
            $loader->setFallbackAutoloader(true);

            //Установка соединения С БД, настройки, кэширование
            require 'config.php';
            $config = new Zend_Config($configArray, true);
            Zend_Registry::set('config', $config);
            define('PREFIX', $config->database->prefix);
            self::getSysConfig();
            self::setCache();
            if ($config->etrace) {
                error_reporting(E_ALL);
                ini_set('display_errors', 1);
            } else {
                error_reporting(0);
                ini_set('display_errors', 0);
            }
            //Подключаем поиск
            Zend_Search_Lucene_Analysis_Analyzer::setDefault(new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());

            //Настройка фронт-контроллера
            $front = Zend_Controller_Front::getInstance();
            $front->setParam('useDefaultControllerAlways', true);
            $front->setDefaultControllerName("index");
            $front->setDefaultAction('index');
            $front->setControllerDirectory(APP_PATH . '/controllers');
            $front->setBaseUrl($config->admin);

            //Шаблоны
            $view = new Zend_View();
            $view->addScriptPath(APP_PATH . '/templates/default/scripts');

            $layout = Zend_Layout::startMvc(array('layout' => 'index'));
            $layout->setView($view);
            $layout->setLayoutPath(APP_PATH . '/templates/default/layouts');

            $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer();
            $viewRenderer->setView($view);
            Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);

            //Сессия и Регистр
            $session = new Zend_Session_Namespace('UnCMS');
            $model = new PageModel();
            $pages_tree = $model->getPagesTree();
            Zend_Registry::set('pages', $pages_tree);
            Zend_Registry::set('breadcrumbs', array());

            //Настройки страницы
            define('BASE_PATH', $config->basepath);
            $pathes = explode(BASE_PATH, $_SERVER["REQUEST_URI"]);
            unset($pathes[0]);
            $way = strtok(trim(implode(BASE_PATH, $pathes)), '/');

            if ($way == $config->admin) {
                define('WAY', 'admin');
                define('TEMPLATE', $config->url . '/templates/default');
                $front->setBaseUrl($config->basepath . $config->admin);
                $addons = new AddonsModel();
                $view->t = $addons->getTranslate();
            } else {
                $router = $front->getRouter();
                $router->addRoute('site', new Zend_Controller_Router_Route('*', array('controller' => 'index', 'action' => 'index')));
                if ($way == 'ajax') {
                    define('WAY', 'ajax');
                    $front->setBaseUrl($config->basepath . 'ajax');
                } else {
                    define('WAY', 'index');
                    $page = $model->getPageByURL(htmlentities($_SERVER["REQUEST_URI"]));
                    if ($page) {
                        if ($config->basepath <> '/') {
                            $front->setBaseUrl($config->basepath . $page->url);
                        } else {
                            $front->setBaseUrl($page->url);
                        }
                    }
                }
            }

            //Определяем базовые константы приложения
            define('ADMIN_URL', $config->url . '/' . $config->admin);
            define('SITE_URL', $config->url);
            define('SITE_TITLE', $config->title);
            define('SITE_SLOGAN', $config->slogan);
            define('LANGUAGE', $config->lang);
            define('MEDIA_PATH', $config->files);
            $view->config = $config;

            //Авторизация
            $auth = Zend_Auth::getInstance();
            if ($auth->hasIdentity()) {
                $view->user = $auth->getIdentity();
                define('USER_ID', $view->user->id);
            } else {
                define('USER_ID', 0);
            }

            $front->throwExceptions(true);
            $front->dispatch();
        } catch (Exception $e) {
            Error::catchException($e);
        }
    }

    /**
     * Установка настроек системы
     */
    static function getSysConfig() {
        $config = Zend_Registry::get('config');
        $db = Zend_Db::factory($config->database);
        $select = $db->select()->from($config->database->prefix . 'config');
        $result = $db->fetchPairs($select);
        $conf = new Zend_Config($result);
        $config->merge($conf);
        $config->readOnly();
        Zend_Db_Table_Abstract::setDefaultAdapter($db);
        $db->setFetchMode(Zend_Db::FETCH_OBJ);
        Zend_Registry::set('db', $db);
    }

    /**
     * Установка кэша системы
     */
    static function setCache() {
        $frontendOptions = array('lifetime' => 7200, 'debug_header' => true);
        $backendOptions = array('cache_dir' => APP_PATH . '/cache/');
        $cache = Zend_Cache::factory('Core', 'File', $frontendOptions, $backendOptions);
        Zend_Registry::set('Zend_Cache', $cache);
    }

}